package com.myCode.Servlet;

import com.myCode.DAO.DaoImpl.ProductDaoImpl;
import com.myCode.DAO.ProductDao;
import com.myCode.Util.IsNotNullUtil;
import com.myCode.entity.Product;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;

@WebServlet("/product")
public class ProductServlet extends HttpServlet {
    private ProductDao productDao = new ProductDaoImpl();

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
        req.setCharacterEncoding("utf-8");
        //获取请求地址的参数
        String userReq = req.getParameter("userReq");
        //对获取到的用户请求操作进行合理化赋值(防止赋值抛出空指针异常)
        userReq = (userReq != null) ? userReq : "";
        try {
            switch (userReq) {
                case "delete":
                    delete(req, resp);
                    break;
                case "input":
                    input(req, resp);
                    break;
                case "save":
                    save(req, resp);
                    break;
                default:
                    showAll(req, resp);
            }
        } catch (IllegalAccessException | InstantiationException e) {
            e.printStackTrace();
        }
    }

    public void save(HttpServletRequest req, HttpServletResponse resp) throws InstantiationException, IllegalAccessException, IOException {
        //获取页面传递的参数
        String productName = req.getParameter("productName");
        String dir_id = req.getParameter("dir_id");
        String salPrice = req.getParameter("salPrice");
        String supplier = req.getParameter("supplier");
        String brand = req.getParameter("brand");
        String cutoff = req.getParameter("cutoff");
        String costPrice = req.getParameter("costPrice");
        //实例化product对象,是通过无参构造函数创建 Product 类的一个新实例的一种方式。
        // 它的作用类似于 new Product()，但是它是通过反射机制动态创建的。
        // 这种方式在编译时不需要知道类的具体名称，而是在运行时动态加载类。
        Product product = Product.class.newInstance();
        //对于获取到的参数进行合理化判断,通过Product对象调用方法,设置给指定的成员字段
        if (IsNotNullUtil.isNotNull(productName)) {
            product.setProductName(productName);
        }
        if (IsNotNullUtil.isNotNull(dir_id)) {
            product.setDir_id(Integer.valueOf(dir_id));
        }
        if (IsNotNullUtil.isNotNull(salPrice)) {
            product.setSalPrice(new BigDecimal(salPrice));
        }
        if (IsNotNullUtil.isNotNull(supplier)) {
            product.setSupplier(supplier);
        }
        if (IsNotNullUtil.isNotNull(brand)) {
            product.setBrand(brand);
        }
        if (IsNotNullUtil.isNotNull(cutoff)) {
            product.setCutoff(new BigDecimal(cutoff));
        }
        if (IsNotNullUtil.isNotNull(costPrice)) {
            product.setCostPrice(new BigDecimal(costPrice));
        }
        //获取请求地址中传递的id属性值
        String id = req.getParameter("id");
        //对获取到的id属性进行非空判断
        if (IsNotNullUtil.isNotNull(id)) {
            //将获取的id属性值设置给当前对象
            product.setId(Integer.valueOf(id));
            //调取修改方法
            productDao.edit(product);
        } else {
            //没有id调用添加方法
            productDao.add(product);
        }
        //操作后重新定向/product请求下的所有商品
        resp.sendRedirect("/product");
    }

    public void input(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
        //获取请求地址中id的属性值
        String id = req.getParameter("id");
        //对获取到的id进行非空判断
        if (IsNotNullUtil.isNotNull(id)) {
            //通过Dao对象调用方法根据id查询指定元素
            Product product = productDao.selOneById(Integer.valueOf(id));
            //通过作用域共享商品
            req.setAttribute("product", product);
        }
        //展示添加后的所有数据(请求转发)
        req.getRequestDispatcher("/WEB-INF/input.jsp").forward(req, resp);
    }

    //当用户发送请求时什么都没有传递,默认执行查询所有操作
    public void showAll(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //调用dao层获取所有数据
        List<Product> products = productDao.selAll();
        //将制定数据通过作用域共享
        req.setAttribute("products", products);
        //将指定作用域中的数据响应给指定页面
        req.getRequestDispatcher("/WEB-INF/showAll.jsp").forward(req, resp);
    }

    //根据用户传递的delete请求和指定id属性值完成删除操作
    public void delete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //获取请求地址中id的属性值
        String id = req.getParameter("id");
        //对获取到的id进行非空判断
        if (IsNotNullUtil.isNotNull(id)) {
            //通过Dao对象调用方法根据id删除元素
            productDao.delById(Integer.valueOf(id));
        }
        //展示删除后的所有数据(重定向)
        resp.sendRedirect("/product");
    }

}
